/***********************************************************************************
 * 文件名： mcu_timer.h
 * 版本：1
 * 说明：
 * 		MDT10F272 的定时器外设驱动。使用说明见头文件。在 bsp-mdt10f272_config.h 文件中可配置初始状态??
 * 修改记录：
 * 	2021/07/14: 初版
 *  2021/08/04: 修改为带PWM功能
***********************************************************************************/
#ifndef _MCU_TIMER_H_
#define _MCU_TIMER_H_

#include "mcu.h"        // 官方提供的MCU型号头文

//-----------------------TIMER0-------------------------------

// Timer0初始化
// 初始化后立即运行
// 在配置文件中统一配置中断使能状态，调用 Mcu_Init 后生效
// TIM0不支持启停，将会一直运行
//Timer0定时器具有自动重装预装填值功能
//如预装填值过大,考虑中断开销,有可能导致溢出中断异常,需慎重考虑
//误差计算未考虑中断开销
#define Tim0_Init()                                                                    \
	{                                                                                  \
		OPT_REG = (TIM0_CLK_SOURCE << 5) | (TIM0_SE << 4) | (0 << 3) | (TIM0_PS << 0); \
		TMR0 = 256 - TIM0_CYCLE;                                                       \
		TMR0EN = 1;                                                                    \
	}

// 获取 TIM0 的中断标志
#define Tim0_GetIntFlag() TIF

// 清除 TIM0 的中断标志
#define Tim0_ClrIntFlag() TIF = 0


//-----------------------TIMER1-------------------------------

//设置TIM1周期
#ifdef TIM1_ONLY_USE_HIGH_8_BIT
#define _HTim1_SetPWM_CYCLE(u8_v)                                       \
	{                                                                   \
		T1PRLH = u8_v >> 4; /*寄存器高4位*/   \
		T1PRLL = u8_v << 4; /*寄存器低字节*/ \
	}
#else
#define _HTim1_SetPWM_CYCLE(u16_v)                                                              \
	{                                                                                           \
		T1PRLH = u16_v >> 8;	  /*寄存器高4位__b<3:0>*/ \
		T1PRLL = u16_v & 0x00ff; /*寄存器低字节*/       \
	}
#endif


//设置TIM1_CH0占空比
#ifdef TIM1_ONLY_USE_HIGH_8_BIT
#define _HTim1_SetCH0H(u8_v)                                       \
	{                                                                   \
		EPRA0H = u8_v >> 4; /*占空比重载寄存器高4位*/   \
		PRLA0L = u8_v << 4; /*占空比重载寄存器低字节*/ \
	}
#else
#define _HTim1_SetCH0H(u16_v)                                                              \
	{                                                                                           \
		EPRA0H = u16_v >> 8;	  /*占空比重载寄存器高4位__b<3:0>*/ \
		PRLA0L = u16_v & 0x00ff; /*占空比重载寄存器低字节*/       \
	}
#endif


//设置TIM1_CH1占空比
#ifdef TIM1_ONLY_USE_HIGH_8_BIT
#define _HTim1_SetCH1H(u8_v)                                       \
	{                                                                   \
		EPRA1H = u8_v >> 4; /*占空比重载寄存器高4位*/   \
		PRLA1L = u8_v << 4; /*占空比重载寄存器低字节*/ \
	}
#else
#define _HTim1_SetCH1H(u16_v)                                                              \
	{                                                                                           \
		EPRA1H = u16_v >> 8;	  /*占空比重载寄存器高4位__b<3:0>*/ \
		PRLA1L = u16_v & 0x00ff; /*占空比重载寄存器低字节*/       \
	}
#endif

// TIM1初始化
void Tim1_Init();

// 启动TIM1
#define Tim1_Run() TMR1ON = 1

// 停止TIM1
#define Tim1_Stop() TMR1ON = 0

// 获取TIM1中断标志
#define Tim1_GetIntFlag() PWMAF

// 清除TIM1中断标志
#define Tim1_ClrIntFlag() PWMAF = 0

// 开启TIM1中断
#define Tim1_EnableInt() PWMAIE = 1

// 关闭TIM1中断
#define Tim1_DisableInt() PWMAIE = 0

//设置TIMER时钟源，单位MHz,仅用于设置TIMER周期值
#define T1SCK 16

// 设置周期值
#define Tim1_SetPeriod(tim_period_t_period) _HTim1_SetPWM_CYCLE(tim_period_t_period)

// 设置频率，单位KHz
#define Tim1_SetFreq(tim_freq_t_freq) _HTim1_SetPWM_CYCLE(((1000*T1SCK/tim_freq_t_freq)/(TIM1_CLKDIV+1)))

// CH0相关函数

// 开启CH0 输出
#define Tim1_EnableCH0() PWMA0ON = 1

// 关闭CH0 输出
#define Tim1_DisableCH0() PWMA0ON = 0

// 设置 CH0 的PWM占空比
// u8_v：PWM值，不能大于4095
#define Tim1_SetCH0Value(u16_v) _HTim1_SetCH0H(u16_v)
	                              
#define  TIM1_CH0_PA0_OUT 1
#define  TIM1_CH0_PC5_OUT 0

// 设置 CH0 的PWM输出引脚
// tim_port_t_port:  TIM1_CH0_PA0_OUT,选择PA0作为输出口
//   				 TIM1_CH0_PC5_OUT,选择PC5作为输出口 
#define Tim1_SetCH0Port(tim_port_t_port) PWMA0TR = tim_port_t_port

// CH1相关函数

// 开启CH1 输出
#define Tim1_EnableCH1() PWMA1ON = 1

// 关闭CH1 输出
#define Tim1_DisableCH1() PWMA1ON = 0

// 设置 CH1 的PWM占空比
// u8_v：PWM值，不能大于4095
#define Tim1_SetCH1Value(u16_v) _HTim1_SetCH1H(u16_v)
	                            
#define  TIM1_CH1_PA1_OUT 1
#define  TIM1_CH1_PC4_OUT 0

// 设置 CH1 的PWM输出引脚
// tim_port_t_port:  TIM1_CH1_PA1_OUT,选择PA1作为输出口
//   				 TIM1_CH1_PC4_OUT,选择PC4作为输出口 
#define Tim1_SetCH1Port(tim_port_t_port)  PWMA1TR = tim_port_t_port     

//-----------------------TIMER2-------------------------------

//设置TIM2周期
#ifdef TIM2_ONLY_USE_HIGH_8_BIT
#define _HTim2_SetPWM_CYCLE(u8_v)                                       \
	{                                                                   \
		T2PRLH = u8_v >> 4; /*寄存器高4位*/   \
		T2PRLL = u8_v << 4; /*寄存器低字节*/ \
	}
#else
#define _HTim2_SetPWM_CYCLE(u16_v)                                                              \
	{                                                                                           \
		T2PRLH = u16_v >> 8;	  /*寄存器高4位__b<3:0>*/ \
		T2PRLL = u16_v & 0x00ff; /*寄存器低字节*/       \
	}
#endif


//设置TIM2_CH0占空比
#ifdef TIM2_ONLY_USE_HIGH_8_BIT
#define _HTim2_SetCH0H(u8_v)                                       \
	{                                                                   \
		EPRB0H = u8_v >> 4; /*占空比重载寄存器高4位*/   \
		PRLB0L = u8_v << 4; /*占空比重载寄存器低字节*/ \
	}
#else
#define _HTim2_SetCH0H(u16_v)                                                              \
	{                                                                                           \
		EPRB0H = u16_v >> 8;	  /*占空比重载寄存器高4位__b<3:0>*/ \
		PRLB0L = u16_v & 0x00ff; /*占空比重载寄存器低字节*/       \
	}
#endif


//设置TIM2_CH1占空比
#ifdef TIM2_ONLY_USE_HIGH_8_BIT
#define _HTim2_SetCH1H(u8_v)                                       \
	{                                                                   \
		EPRB1H = u8_v >> 4; /*占空比重载寄存器高4位*/   \
		PRLB1L = u8_v << 4; /*占空比重载寄存器低字节*/ \
	}
#else
#define _HTim2_SetCH1H(u16_v)                                                              \
	{                                                                                           \
		EPRB1H = u16_v >> 8;	  /*占空比重载寄存器高4位__b<3:0>*/ \
		PRLB1L = u16_v & 0x00ff; /*占空比重载寄存器低字节*/       \
	}
#endif

// TIM2初始化
void Tim2_Init();

// 启动TIM2
#define Tim2_Run() TMR2ON = 1

// 停止TIM2
#define Tim2_Stop() TMR2ON = 0

// 获取TIM2中断标志
#define Tim2_GetIntFlag() PWMBF

// 清除TIM2中断标志
#define Tim2_ClrIntFlag() PWMBF = 0

// 开启TIM2中断
#define Tim2_EnableInt() PWMBIE = 1

// 关闭TIM2中断
#define Tim2_DisableInt() PWMBIE = 0

//设置TIMER时钟源，单位MHz,仅用于设置TIMER周期值
#define T2SCK 16

// 设置周期值
#define Tim2_SetPeriod(tim_period_t_period) _HTim2_SetPWM_CYCLE(tim_period_t_period)

// 设置频率，单位KHz
#define Tim2_SetFreq(tim_freq_t_freq) 	_HTim2_SetPWM_CYCLE(((1000*T2SCK/tim_freq_t_freq)/(TIM2_CLKDIV+1)))

// CH0相关函数

// 开启CH0 输出
#define Tim2_EnableCH0() PWMB0ON = 1

// 关闭CH0 输出
#define Tim2_DisableCH0() PWMB0ON = 0

// 设置 CH0 的PWM占空比
// u8_v：PWM值，不能大于4095
#define Tim2_SetCH0Value(u16_v) _HTim2_SetCH0H(u16_v)

#define  TIM2_CH0_PA2_OUT 1
#define  TIM2_CH0_PC3_OUT 0

// 设置 CH0 的PWM输出引脚
// tim_port_t_port:  TIM2_CH0_PA2_OUT,选择PA2作为输出口
//   				 TIM2_CH0_PC3_OUT,选择PC3作为输出口 
#define Tim2_SetCH0Port(tim_port_t_port) PWMB0TR = tim_port_t_port         

// CH1相关函数

// 开启CH1 输出
#define Tim2_EnableCH1() PWMB1ON = 1

// 关闭CH1 输出
#define Tim2_DisableCH1() PWMB1ON = 0

// 设置 CH1 的PWM占空比
// u8_v：PWM值，不能大于4095
#define Tim2_SetCH1Value(u16_v) _HTim2_SetCH1H(u16_v)

#define  TIM2_CH1_PA5_OUT 1
#define  TIM2_CH1_PC0_OUT 0

// 设置 CH1 的PWM输出引脚
// tim_port_t_port:  TIM2_CH1_PA5_OUT,选择PA5作为输出口
//   				 TIM2_CH1_PC0_OUT,选择PC0作为输出口
#define Tim2_SetCH1Port(tim_port_t_port) PWMB1TR = tim_port_t_port

#endif
